Firebird - zaokruhlovanie ceny na 0.50hal
Otázka od: martin
2. 7. 2004 1:39
Dobry den,
mam v tabulke vypocitavane pole SUMA
Ako na strane servera vyriesit zaokruhlovanie na .50halierov
ak SUMA>.00 AND SUMA < .35 vysledok .00
ak SUMA>=.35 AND SUMA < .75 vysledok .50
ak SUMA>=.75 AND SUMA <= 1 vysledok 1.00
Skratka podla pravidiel zaukruhlovania v SK uctovnictve.
Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
Neviem najst ziaden SQL prikaz na zaokruhlovanie.
Da sa to bez UDF? A ak nie mate niekto taku UDF?
--
Martin
D7Pro,FB1.5,FibPlus
Odpovedá: Fedor 'fi0dor' Tirsel
2. 7. 2004 1:59
: Dobry den,
Zdravim,
: mam v tabulke vypocitavane pole SUMA
: Ako na strane servera vyriesit zaokruhlovanie na .50halierov
: ak SUMA>.00 AND SUMA < .35 vysledok .00
: ak SUMA>=.35 AND SUMA < .75 vysledok .50
: ak SUMA>=.75 AND SUMA <= 1 vysledok 1.00
: Skratka podla pravidiel zaukruhlovania v SK uctovnictve.
:
: Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
: a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
: Neviem najst ziaden SQL prikaz na zaokruhlovanie.
:
: Da sa to bez UDF? A ak nie mate niekto taku UDF?
islo by to samozrejme urobit uplne jednoducho cez UDF, ale na tento pripad
bohato postaci aj sql prikaz CASE.
Priklad s CASE:
SELECT
o.id,
o.description,
CASE
WHEN (o.status IS NULL) THEN 'new'
WHEN (o.status = 1) THEN 'confirmed'
WHEN (o.status = 3) THEN 'in production'
WHEN (o.status = 4) THEN 'ready'
WHEN (o.status = 5) THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM orders o;
S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info
Odpovedá: martin
2. 7. 2004 2:19
> : mam v tabulke vypocitavane pole SUMA
> : Ako na strane servera vyriesit zaokruhlovanie na .50halierov
> : ak SUMA>>.00 AND SUMA < .35 vysledok .00
> : ak SUMA>>=.35 AND SUMA < .75 vysledok .50
> : ak SUMA>>=.75 AND SUMA <= 1 vysledok 1.00
> : Skratka podla pravidiel zaukruhlovania v SK uctovnictve.
> :
> : Treba napisat nejaku stored procedure, ktorej vstupom bude SUMA
> : a vystupom ZAOKR_SUMA? Ale aky kod tej procedury?
> : Neviem najst ziaden SQL prikaz na zaokruhlovanie.
> :
> : Da sa to bez UDF? A ak nie mate niekto taku UDF?
> islo by to samozrejme urobit uplne jednoducho cez UDF, ale na tento pripad
> bohato postaci aj sql prikaz CASE.
> Priklad s CASE:
> SELECT
> o.id,
> o.description,
> CASE
> WHEN (o.status IS NULL) THEN 'new'
> WHEN (o.status = 1) THEN 'confirmed'
> WHEN (o.status = 3) THEN 'in production'
> WHEN (o.status = 4) THEN 'ready'
> WHEN (o.status = 5) THEN 'shipped'
> ELSE 'unknown status ''' || o.Status || ''''
> END
> FROM orders o;
OK, ale ja potrebujem, aby hodnota polozky SUMA bola zaokruhlena podla
horeuvedenych pravidiel.
Cize ak zavolam SELECT ID_DOKLAD,SUMA FROM FAKTURY
vo vysledku bude zaokruhlena suma i ked je to vypocitavane pole typu
DOUBLE PRECISION
Dik
~~~
Martin
Odpovedá: Fedor 'fi0dor' Tirsel
2. 7. 2004 2:59
: OK, ale ja potrebujem, aby hodnota polozky SUMA bola zaokruhlena podla
: horeuvedenych pravidiel.
: Cize ak zavolam SELECT ID_DOKLAD,SUMA FROM FAKTURY
: vo vysledku bude zaokruhlena suma i ked je to vypocitavane pole typu
: DOUBLE PRECISION
Pisem to z hlavy, takze funkcnost nezarucujem. Kazdopadne takto nejak by sa to
mohlo uberat, pokial chcete pouzit cisto iba SQL a defaultne UDF (pomocou
vlastnej UDF by to bolo ovela prehladnejsie resp. jednoduchsie!)
SELECT id_doklad,
CASE
WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75) THEN
FLOOR(suma) + '0.50'
WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
END AS "zaokruhlena_suma"
FROM FAKTURY
S pozdravom...
--
Fedor 'fi0dor' Tirsel
www.fi0dor.info
Odpovedá: petr palicka
2. 7. 2004 7:21
ahoj,
nikdy jsem to nakonec nepouzil, ale
melo by to fungovat. je to jedna funkce
z nasi firemni UDF. Pokud by sis s tim
nevedel rady, poslu ti cely zdrojak.
peca:
(*
/* zaokrouhleni na padesatniky */
declare external function Round50
Double precision
returns Double precision by value
entry_point 'Round50' module_name 'ag_udf.dll';
*)
function Round50(var a: Double): Double; cdecl; export;
var
i: Integer;
begin
i:=Round(frac(a)*100);
if i<25 then // do 25 mimo dolu
Result:=Floor(a)
else if i<75 then // od 25 vcetne do 75 mimo na 50
Result:=Floor(a)+0.5 // od 75 vcetne nahoru
else
Result:=Floor(a)+1;
end;
Odpovedá: petr palicka
2. 7. 2004 7:19
> SELECT id_doklad,
> CASE
> WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
> WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75) THEN
> FLOOR(suma) + '0.50'
> WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
> END AS "zaokruhlena_suma"
> FROM FAKTURY
nebo tak. jen bych chtel upozornit, ze misto
.35 tam ma byt AFAIK .25 !!! teda jedna-li se
o zaokrouhlovani castky na koruny a padesatniky.
Peca
Odpovedá: Tomas Bradle
2. 7. 2004 17:26
A co takhle nejprve vynasobit 2, zaokrouhlit a vydelit 2:
SELECT CAST(CAST(2*CASTKA AS INTEGER) AS DECIMAL(9,2))/2 FROM TEST
vyzkouseno, funguje na FB 1.5
Tomas Bradle
t.bradle@worldonline.cz
----- Original Message -----
From: "petr palicka" <palicka.petr@seznam.cz>
> > SELECT id_doklad,
> > CASE
> > WHEN ((suma - FLOOR(suma))<0.35) THEN FLOOR(suma)
> > WHEN ((suma - FLOOR(suma))>=0.35 AND (suma - FLOOR(suma)) < 0.75)
THEN
> > FLOOR(suma) + '0.50'
> > WHEN ((suma - FLOOR(suma))>=0.75) THEN CEILING(suma)
> > END AS "zaokruhlena_suma"
> > FROM FAKTURY
>
> nebo tak. jen bych chtel upozornit, ze misto
> .35 tam ma byt AFAIK .25 !!! teda jedna-li se
> o zaokrouhlovani castky na koruny a padesatniky.
>